<?php
  // Primero creamos un proceso hijo
  $pid = pcntl_fork();
  if ($pid == -1) {
    $now = date("Y-m-d H:i:s") . substr((string)microtime(), 1, 8);
    error_log("{$now} #### Error #### Problem with fork \r\n", 3, LOG_FILE);
    die();
  }

  // Preguntamos si somos el proceso padre o el hijo recien construido
  if ($pid) {
    $now = date("Y-m-d H:i:s") . substr((string)microtime(), 1, 8);
    error_log("{$now} #### Father #### Terminating father \r\n", 3, LOG_FILE);
    exit();
  }


  // De aqui en adelante solo se ejecuta si soy el hijo y futuro daemon

  // Lo siguiente que hacemos es soltarnos de la terminal de control
  if (!posix_setsid()) {
    $now = date("Y-m-d H:i:s") . substr((string)microtime(), 1, 8);
    error_log("{$now} #### Error #### Can't leave terminal \r\n", 3, LOG_FILE);
    die();
  }

  // De este punto en adelante debemos cambiarnos de directorio y
  // hacemos las recomendaciones de Wikipedia para un daemon
  chdir("/");
  umask(0);


  // revisamos la ejecución por cada línea de código
  declare(ticks = 1);
  $signal_code = FALSE; 


  // signals handler
  pcntl_signal(SIGTERM, "signal_handler");
  pcntl_signal(SIGINT, "signal_handler");

  function signal_handler($signal) {
      global $signal_code;

      if (($signal == SIGTERM) OR ($signal == SIGINT)) {
        $now = date("Y-m-d H:i:s") . substr((string)microtime(), 1, 8);
        error_log("{$now} #### Signal #### Terminating process \r\n", 3, LOG_FILE);
        $signal_code = TRUE;
      }
  }

  // Si estamos aqui oficialmente somos un daemon
